"""
自动文档生成器
为插件和API自动生成文档
"""

import os
import json
import inspect
from typing import Any, Dict, List, Optional, Type
from pathlib import Path


class DocumentationGenerator:
    """文档生成器"""
    
    def __init__(self, output_dir: str = "./docs"):
        self.output_dir = output_dir
        os.makedirs(output_dir, exist_ok=True)
    
    def generate_plugin_documentation(self, plugin_instance: Any, plugin_config: Dict) -> str:
        """生成插件文档"""
        lines = []
        
        # 插件基本信息
        lines.append(f"# {plugin_config.get('name', 'Unknown Plugin')}")
        lines.append("")
        lines.append(f"**版本**: {plugin_config.get('version', '1.0.0')}")
        lines.append("")
        lines.append(f"**作者**: {plugin_config.get('author', 'Unknown')}")
        lines.append("")
        lines.append(f"**描述**: {plugin_config.get('description', 'No description provided')}")
        lines.append("")
        
        # 配置信息
        lines.append("## 配置参数")
        lines.append("")
        config = plugin_config.get('config', {})
        if config:
            lines.append("| 参数 | 默认值 | 描述 |")
            lines.append("|------|--------|------|")
            for key, value in config.items():
                lines.append(f"| {key} | {repr(value)} |  |")
        else:
            lines.append("无配置参数")
        lines.append("")
        
        # API文档
        lines.append("## API接口")
        lines.append("")
        
        # 获取插件类的方法
        plugin_class = plugin_instance.__class__
        methods = inspect.getmembers(plugin_class, predicate=inspect.isfunction)
        
        for name, method in methods:
            if not name.startswith('_') or name in ['__init__']:
                lines.append(f"### {name}")
                lines.append("")
                
                # 方法签名
                try:
                    sig = inspect.signature(method)
                    lines.append(f"```python")
                    lines.append(f"{name}{sig}")
                    lines.append(f"```")
                    lines.append("")
                except:
                    pass
                
                # 方法文档
                doc = inspect.getdoc(method)
                if doc:
                    lines.append(doc)
                    lines.append("")
        
        return "\n".join(lines)
    
    def generate_api_documentation(self, module: Any, module_name: str) -> str:
        """生成API文档"""
        lines = []
        
        lines.append(f"# {module_name} API Documentation")
        lines.append("")
        
        # 模块文档
        module_doc = inspect.getdoc(module)
        if module_doc:
            lines.append(module_doc)
            lines.append("")
        
        # 类文档
        classes = inspect.getmembers(module, predicate=inspect.isclass)
        if classes:
            lines.append("## 类")
            lines.append("")
            
            for name, cls in classes:
                # 跳过导入的类
                if cls.__module__ != module_name:
                    continue
                
                lines.append(f"### {name}")
                lines.append("")
                
                # 类文档
                cls_doc = inspect.getdoc(cls)
                if cls_doc:
                    lines.append(cls_doc)
                    lines.append("")
                
                # 类方法
                methods = inspect.getmembers(cls, predicate=inspect.isfunction)
                if methods:
                    lines.append("#### 方法")
                    lines.append("")
                    for method_name, method in methods:
                        if not method_name.startswith('_') or method_name == '__init__':
                            lines.append(f"**{method_name}**")
                            
                            try:
                                sig = inspect.signature(method)
                                lines.append(f"```python")
                                lines.append(f"{method_name}{sig}")
                                lines.append(f"```")
                                lines.append("")
                            except:
                                pass
                            
                            method_doc = inspect.getdoc(method)
                            if method_doc:
                                lines.append(method_doc)
                                lines.append("")
        
        # 函数文档
        functions = inspect.getmembers(module, predicate=inspect.isfunction)
        if functions:
            lines.append("## 函数")
            lines.append("")
            
            for name, func in functions:
                # 跳过导入的函数
                if func.__module__ != module_name:
                    continue
                
                lines.append(f"### {name}")
                lines.append("")
                
                try:
                    sig = inspect.signature(func)
                    lines.append(f"```python")
                    lines.append(f"{name}{sig}")
                    lines.append(f"```")
                    lines.append("")
                except:
                    pass
                
                func_doc = inspect.getdoc(func)
                if func_doc:
                    lines.append(func_doc)
                    lines.append("")
        
        return "\n".join(lines)
    
    def generate_plugin_api_reference(self, plugin_manager: Any) -> str:
        """生成插件API参考文档"""
        lines = []
        
        lines.append("# 插件API参考")
        lines.append("")
        lines.append("## 核心类")
        lines.append("")
        
        # PluginBase 类
        lines.append("### PluginBase")
        lines.append("")
        lines.append("所有插件必须继承的基类")
        lines.append("")
        lines.append("#### 方法")
        lines.append("")
        lines.append("**__init__()**")
        lines.append("")
        lines.append("初始化插件实例")
        lines.append("")
        lines.append("**on_load(context)**")
        lines.append("")
        lines.append("插件加载时调用")
        lines.append("")
        lines.append("- `context`: API上下文对象")
        lines.append("")
        lines.append("**on_unload()**")
        lines.append("")
        lines.append("插件卸载时调用")
        lines.append("")
        lines.append("**run(*args, **kwargs)**")
        lines.append("")
        lines.append("插件主要功能入口")
        lines.append("")
        lines.append("- `*args`: 位置参数")
        lines.append("- `**kwargs`: 关键字参数")
        lines.append("- 返回值: 执行结果")
        lines.append("")
        
        # PluginManager 类
        lines.append("### PluginManager")
        lines.append("")
        lines.append("插件管理器，负责插件的生命周期管理")
        lines.append("")
        lines.append("#### 方法")
        lines.append("")
        lines.append("**__init__(plugin_dir, api_context=None, hook_hub=None)**")
        lines.append("")
        lines.append("初始化插件管理器")
        lines.append("")
        lines.append("- `plugin_dir`: 插件目录路径")
        lines.append("- `api_context`: API上下文（可选）")
        lines.append("- `hook_hub`: 钩子中心（可选）")
        lines.append("")
        lines.append("**scan(auto_load=False)**")
        lines.append("")
        lines.append("扫描插件目录")
        lines.append("")
        lines.append("- `auto_load`: 是否自动加载插件")
        lines.append("- 返回值: 发现的插件名称列表")
        lines.append("")
        lines.append("**load(name)**")
        lines.append("")
        lines.append("加载指定插件")
        lines.append("")
        lines.append("- `name`: 插件名称")
        lines.append("- 返回值: 插件实例")
        lines.append("")
        lines.append("**unload(name)**")
        lines.append("")
        lines.append("卸载指定插件")
        lines.append("")
        lines.append("- `name`: 插件名称")
        lines.append("- 返回值: 是否卸载成功")
        lines.append("")
        
        return "\n".join(lines)
    
    def save_documentation(self, content: str, filename: str, format: str = "md"):
        """保存文档"""
        file_path = os.path.join(self.output_dir, f"{filename}.{format}")
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(content)
        return file_path
    
    def generate_full_documentation(self, plugin_manager: Any, plugins: Dict[str, Any]) -> List[str]:
        """生成完整文档"""
        generated_files = []
        
        # 生成API参考
        api_ref = self.generate_plugin_api_reference(plugin_manager)
        file_path = self.save_documentation(api_ref, "api_reference")
        generated_files.append(file_path)
        
        # 为每个插件生成文档
        for plugin_name, plugin_instance in plugins.items():
            try:
                config = plugin_manager.get_config(plugin_name)
                if config:
                    config_dict = config.to_dict()
                    plugin_doc = self.generate_plugin_documentation(plugin_instance, config_dict)
                    file_path = self.save_documentation(plugin_doc, f"plugin_{plugin_name}")
                    generated_files.append(file_path)
            except Exception as e:
                print(f"Error generating documentation for {plugin_name}: {e}")
        
        return generated_files


class TemplateGenerator:
    """模板文档生成器"""
    
    def __init__(self, templates_dir: str = "./docs/templates"):
        self.templates_dir = templates_dir
        os.makedirs(templates_dir, exist_ok=True)
        self._load_templates()
    
    def _load_templates(self):
        """加载模板文件"""
        # 插件模板
        plugin_template = """# {{plugin_name}}

## 基本信息
- **版本**: {{version}}
- **作者**: {{author}}
- **描述**: {{description}}

## 配置参数
{% if config %}
| 参数 | 默认值 | 描述 |
|------|--------|------|
{% for key, value in config.items() %}
| {{key}} | {{value}} |  |
{% endfor %}
{% else %}
无配置参数
{% endif %}

## 使用方法
```python
# 加载插件
plugin = manager.load("{{plugin_name}}")

# 运行插件
result = plugin.run()
```

## API参考
### 方法
{% for method in methods %}
#### {{method.name}}
```python
{{method.signature}}
```
{{method.docstring}}
{% endfor %}
"""
        
        # 保存模板
        with open(os.path.join(self.templates_dir, "plugin_template.md"), 'w', encoding='utf-8') as f:
            f.write(plugin_template)
    
    def generate_from_template(self, template_name: str, context: Dict[str, Any]) -> str:
        """从模板生成文档"""
        try:
            template_path = os.path.join(self.templates_dir, f"{template_name}.md")
            with open(template_path, 'r', encoding='utf-8') as f:
                template = f.read()
            
            # 简单的模板渲染（实际项目中可以使用Jinja2等专业模板引擎）
            result = template
            for key, value in context.items():
                if isinstance(value, dict):
                    # 处理字典类型
                    continue
                elif isinstance(value, list):
                    # 处理列表类型
                    continue
                else:
                    result = result.replace(f"{{{{{key}}}}}", str(value))
            
            return result
        except Exception as e:
            print(f"Error generating from template: {e}")
            return ""


# 使用示例
if __name__ == "__main__":
    # 创建文档生成器
    doc_gen = DocumentationGenerator("./generated_docs")
    
    # 创建模板生成器
    template_gen = TemplateGenerator("./docs/templates")
    
    print("Documentation generators initialized")
    print(f"Output directory: {doc_gen.output_dir}")
    print(f"Templates directory: {template_gen.templates_dir}")